package string;
/**
 * String字符串类:
 * 1.java会将所有使用字面量(直接量)形式创建的字符串对象缓存在常量池中，
 *   每当使用相同字面量形式创建字符串时，会重用对象以减少内存开销
 * 2.new String()创建时，一定会创建新对象
 * 3.String是不变对象，创建后内容不可改变，若改变则创建新对象
 * 4.若想比较字符串内容相同，需要使用equals()方法
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1="123abc";//字符串创建字符串第一次使用时会缓存在常量池中
        String s2="123abc";//重用s1对象（复用常量池中“123abc”对象）
        String s3="123abc";//依旧重复
        String s4=new String("123abc");//new 一定会重新创建对象，有新的地址，不推荐这样的方式来创建字符串对象


        System.out.println(s1==s2);//true，s1和s2为引用类型变量，保存的是地址，此时地址相同
        System.out.println(s1==s3);//true，s1和s3为引用类型变量，保存的是地址，此时地址相同
        System.out.println(s1==s4);//false，s1和s4的地址不同


        String s5="123";
        String s6=s5+"abc";//拼接字符串，会创建新的对象（有新的地址），没有复用常量池，
        System.out.println(s6==s1);//false，所以s6和s1的地址不同
        //两个字面量拼接，会触发预计算特性，直接编译为String s7="123abc"，复用该对象
        String s7="123"+"abc";
        System.out.println(s7==s1);//true，s7和s1的地址相同

        String s8="123abc";//复用s1对象   常量池中的地址
        String s9=new String("123abc");//新建对象，新的地址
        System.out.println(s8==s9);//false，==比较的是地址，地址不同
        System.out.println(s8.equals(s9));//true，equals()比较的是字符串内容




    }
}
